8. 日志(logging)¶
8.1. 日志相关概念¶
日志
严重性级别(Level)
不同用户
用户
开发
运维
DEBUG
INFO
NOTICE
WARNING
ERROR
CRITICAL
ALERT
EMERGENCY
IO操作
作用:
调试
了解软件运行情况
时候分析定位问题
日志信息:
time
lcoation
level
content
成熟第三方
log4j
log4php
python: logging
8.2. Logging模块¶
级别
可以自定义
DEBUG
INFO
WARNING
ERROR
CRITICAL
级别逐渐增加
只需要指定一个级别就好,高级别的自动记录
使用方式:
直接使用logging(封装了其他组件)
使用Logging四大组件
8.3. 2.1 logging模块级别日志¶
使用一下几个函数
logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录 logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录 logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录 logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录 logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录 logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录 logging.basicConfig(**kwargs) 对root logger进行一次性配置
logging.basicConfig(**kwargs)函数用于指定“要记录的日志级别”、“日志格式”、“日志输出位置”、“日志文件的打开模式”等信息,其他几个都是用于记录各个级别日志的函数
只第一次调用起作用
不配置使用默认值
输出: sys.stderr
级别: WARNING
格式: lever:log name:content
案例01
format参数
asctime %(asctime)s 日志事件发生的时间--人类可读时间,如:2003-07-08 16:49:45,896 created %(created)f 日志事件发生的时间--时间戳,就是当时调用time.time()函数返回的值 relativeCreated %(relativeCreated)d 日志事件发生的时间相对于logging模块加载时间的相对毫秒数(目前还不知道干嘛用的) msecs %(msecs)d 日志事件发生事件的毫秒部分 levelname %(levelname)s 该日志记录的文字形式的日志级别('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL') levelno %(levelno)s 该日志记录的数字形式的日志级别(10, 20, 30, 40, 50) name %(name)s 所使用的日志器名称,默认是'root',因为默认使用的是 rootLogger message %(message)s 日志记录的文本内容,通过 msg % args计算得到的 pathname %(pathname)s 调用日志记录函数的源码文件的全路径 filename %(filename)s pathname的文件名部分,包含文件后缀 module %(module)s filename的名称部分,不包含后缀 lineno %(lineno)d 调用日志记录函数的源代码所在的行号 funcName %(funcName)s 调用日志记录函数的函数名 process %(process)d 进程ID processName %(processName)s 进程名称,Python 3.1新增 thread %(thread)d 线程ID threadName %(thread)s 线程名称
日志器有层级关系,默认是RootLogger,单例模式
对于msg可以使用format格式, logging.debug(“%s is %d years old”, ‘dana’, 10)
**kwargs参数的含义
exc_info: 其值为布尔值,如果该参数的值设置为True,则会将异常异常信息添加到日志消息中。如果没有异常信息则添加None到日志信息中。
stack_info: 其值也为布尔值,默认值为False。如果该参数的值设置为True,栈信息将会被添加到日志信息中。
extra: 这是一个字典(dict)参数,它可以用来自定义消息格式中所包含的字段,但是它的key不能与logging模块定义的字段冲突。
案例02
8.4. 2.1 logging模块日志处理流程¶
四大组件, logging模块由四个模块来处理日志
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器 Formatter 决定日志记录的最终输出格式
日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等; 不同的处理器(handler)可以将日志输出到不同的位置; 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置; 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志; 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。
Logger
三大任务
1)向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;
2)基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理;
3)将日志消息传送给所有感兴趣的日志handlers。
对象分类
配置
Logger.setLevel() 设置日志器将会处理的日志消息的最低严重级别 Logger.addHandler() 和 Logger.removeHandler() 为该logger对象添加 和 移除一个handler对象 Logger.addFilter() 和 Logger.removeFilter() 为该logger对象添加 和 移除一个filter对象
日志创建
Logger.debut()…….
Logger.exception(): 创建类似于Logger.error的日志消息
Logger.log():获取一个明确的日志level参数类创建一个日志记录
得到Logger对象
实例化
logging.getLogger(): name=’root’
Handler
把消息发送到handler指定的位置
Logger通过addHandler添加handler
方法:
setLevel
setFormat
addFilter, removeFilter
不要直接使用,Handler是基础类
logging.StreamHandler 将日志消息发送到输出到Stream,如std.out, std.err或任何file-like对象。 logging.FileHandler 将日志消息发送到磁盘文件,默认情况下文件大小会无限增长 logging.handlers.RotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按大小切割 logging.hanlders.TimedRotatingFileHandler 将日志消息发送到磁盘文件,并支持日志文件按时间切割 logging.handlers.HTTPHandler 将日志消息以GET或POST的方式发送给一个HTTP服务器 logging.handlers.SMTPHandler 将日志消息发送给一个指定的email地址 logging.NullHandler 该Handler实例会忽略error messages,通常被想使用logging的library开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
Format类
应用代码可以直接实例化
可以继承Format添加特殊内容
三个参数:
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用”%Y-%m-%d %H:%M:%S”
style:Python 3.2新增的参数,可取值为 ‘%’, ‘{‘和 ‘$’,如果不指定该参数则默认使用’%’
Filter类
被Handdler和Logger使用
用于具体控制传递的record记录是否能通过过滤
案例03